<?php
/**
 * MediaManager - 媒体资源管理类
 * 
 * 提供媒体资源的管理功能，包括:
 * - 音频播放
 * - 媒体资源上传
 * - 获取媒体资源
 */
class MediaManager {
    private $db;
    
    /**
     * 构造函数
     */
    public function __construct() {
        require_once __DIR__ . '/db/Database.php';
        $this->db = Database::getInstance();
    }
    
    /**
     * 获取媒体资源信息
     * 
     * @param int $mediaId 媒体ID
     * @return array|null 媒体信息
     */
    public function getMediaById($mediaId) {
        $sql = "SELECT * FROM media_resources WHERE media_id = ?";
        return $this->db->fetchRow($sql, [$mediaId]);
    }
    
    /**
     * 通过路径获取媒体资源
     * 
     * @param string $filePath 文件路径
     * @return array|null 媒体信息
     */
    public function getMediaByPath($filePath) {
        $sql = "SELECT * FROM media_resources WHERE file_path = ?";
        return $this->db->fetchRow($sql, [$filePath]);
    }
    
    /**
     * 上传媒体文件并添加到数据库
     * 
     * @param array $file $_FILES数组中的文件信息
     * @param string $type 媒体类型 (image, audio, video)
     * @param string $targetDir 目标目录
     * @return array|false 成功返回媒体信息，失败返回false
     */
    public function uploadMedia($file, $type, $targetDir) {
        // 检查文件类型
        $allowedTypes = [];
        $maxSize = 0;
        
        switch ($type) {
            case 'image':
                $allowedTypes = ALLOWED_IMAGE_TYPES;
                $maxSize = MAX_IMAGE_SIZE;
                break;
            case 'audio':
                $allowedTypes = ALLOWED_AUDIO_TYPES;
                $maxSize = MAX_AUDIO_SIZE;
                break;
            default:
                return false;
        }
        
        // 检查文件类型
        if (!in_array($file['type'], $allowedTypes)) {
            return false;
        }
        
        // 检查文件大小
        if ($file['size'] > $maxSize) {
            return false;
        }
        
        // 创建目标目录（如果不存在）
        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0755, true);
        }
        
        // 生成唯一文件名
        $fileExt = pathinfo($file['name'], PATHINFO_EXTENSION);
        $newFileName = uniqid() . '.' . $fileExt;
        $targetPath = $targetDir . '/' . $newFileName;
        
        // 移动文件
        if (move_uploaded_file($file['tmp_name'], $targetPath)) {
            // 添加到数据库
            $mediaData = [
                'media_type' => $type,
                'file_path' => $targetPath,
                'file_name' => $file['name'],
                'file_size' => $file['size'],
                'mime_type' => $file['type']
            ];
            
            $mediaId = $this->db->insert('media_resources', $mediaData);
            
            if ($mediaId) {
                $mediaData['media_id'] = $mediaId;
                return $mediaData;
            }
        }
        
        return false;
    }
    
    /**
     * 生成音频元素HTML代码
     * 
     * @param int|string $audioId 音频ID或路径
     * @param string $elementId 元素ID
     * @param bool $autoPlay 是否自动播放
     * @return string HTML代码
     */
    public function generateAudioElement($audioId, $elementId, $autoPlay = false) {
        $audioSrc = '';
        
        // 如果是数字，则作为ID查询
        if (is_numeric($audioId)) {
            $media = $this->getMediaById($audioId);
            if ($media) {
                $audioSrc = $media['file_path'];
            }
        } else {
            // 否则直接使用作为路径
            $audioSrc = $audioId;
        }
        
        if (empty($audioSrc)) {
            return '';
        }
        
        $autoPlayAttr = $autoPlay ? ' autoplay' : '';
        
        return '<audio id="' . $elementId . '" src="' . htmlspecialchars($audioSrc) . '"' . $autoPlayAttr . '></audio>';
    }
    
    /**
     * 生成音频按钮HTML代码
     * 
     * @param string $audioElementId 对应的音频元素ID
     * @param string $size 按钮大小 (small, normal, large)
     * @param string $text 按钮文本
     * @return string HTML代码
     */
    public function generateAudioButton($audioElementId, $size = 'normal', $text = '') {
        $sizeClass = '';
        switch ($size) {
            case 'small':
                $sizeClass = ' small';
                break;
            case 'large':
                $sizeClass = ' large';
                break;
        }
        
        $buttonText = empty($text) ? '🔊' : htmlspecialchars($text);
        
        return '<button class="audio-btn' . $sizeClass . '" data-audio-id="' . $audioElementId . '">' . $buttonText . '</button>';
    }
    
    /**
     * 删除媒体资源
     * 
     * @param int $mediaId 媒体ID
     * @return bool 是否成功
     */
    public function deleteMedia($mediaId) {
        $media = $this->getMediaById($mediaId);
        
        if (!$media) {
            return false;
        }
        
        // 删除文件
        if (file_exists($media['file_path'])) {
            unlink($media['file_path']);
        }
        
        // 从数据库删除记录
        return $this->db->delete('media_resources', 'media_id = ?', [$mediaId]) > 0;
    }
} 